/* 
 * File:   VentanaJuego.cpp
 * Author: nahuel
 * 
 * Created on November 3, 2012, 3:07 PM
 */

#include <glibmm-2.4/glibmm/main.h>
#include <gdkmm-3.0/gdkmm/rectangle.h>


#include "VentanaJuego.h"
#include "Trayectoria.h"	//#include "../Juego-ModeloDatos/Trayectoria.h"
#include "Actor.h"	//#include "../Juego-ModeloDatos/Actor.h"
#include "Rol.h"	//#include "../Juego-ModeloDatos/Rol.h"
#include "Posicion.h"	//#include "../Juego-ModeloDatos/Posicion.h"
#include "ActoresConstantes.h"	//#include "../Juego-ModeloDatos/ActoresConstantes.h"

using namespace TP::Juego::Arena::Actores;

VentanaJuego::VentanaJuego(Cliente* cliente, float fps) {	
	_dibujador = new Dibujador(this);
	_cliente = cliente;
	
	Glib::signal_timeout().connect(
			sigc::mem_fun(*this, &VentanaJuego::on_timeout), 1000/fps);
	add_events(Gdk::BUTTON_PRESS_MASK);
}

bool VentanaJuego::on_draw(const Cairo::RefPtr<Cairo::Context>& context) {
	_dibujador->DibujarFondo();
		
	// Dibujamos todos los actores
	_mutex.lock();
	
	vector<Actor*>& vectorActores = _partida->ArenaJuego()->getActores();
	vector<Actor*>::iterator iterator;
	
	for (iterator = vectorActores.begin(); 
		 iterator != vectorActores.end();
		 ++iterator) {
		Actor* actor = *iterator;
		Posicion* posicion = actor->getTrayectoria()->getPosicion();
					
		long int x = posicion->X();
		long int y = posicion->Y();
		Rol* rol = actor->getRol();
		
		if (rol->Nombre() == PAJARITO) {
			_dibujador->DibujarPajaro(x, y);
		} else if(rol->Nombre() == CERDITO) {
			_dibujador->DibujarCerdito(x, y);
		} else if(rol->Nombre() == CAJA) {
			_dibujador->DibujarCaja(x, y);
		}
	}
	
	_mutex.unlock();
}

void VentanaJuego::SetImagenPajaro(std::string pathImagen) {
	_dibujador->SetImagenPajaro(pathImagen);
}

void VentanaJuego::SetImagenCerdito(std::string pathImagen) {
	_dibujador->SetImagenCerdito(pathImagen);
}

void VentanaJuego::SetImagenFondo(std::string pathImagen) {
	_dibujador->SetImagenFondo(pathImagen);
}

void VentanaJuego::SetPartida(Partida* partida) {
	_mutex.lock();
	_partida = partida;
	_mutex.unlock();
}

bool VentanaJuego::on_timeout() {
	// Obliga a la ventana a redibujarse
    Glib::RefPtr<Gdk::Window> window = get_window();
	
    if (window) {
        Gdk::Rectangle rectangulo(0, 0, get_allocation().get_width(),
								        get_allocation().get_height());
        window->invalidate_rect(rectangulo, false);
    }
	
    return true;	
}

bool VentanaJuego::on_button_press_event(GdkEventButton* event) {
	unsigned int x = (unsigned int) event->x;
	unsigned int y = (unsigned int) event->y;	
	
	Posicion pos(x, y);
	_cliente->atacar(&pos);
}

VentanaJuego::~VentanaJuego() {
	delete _dibujador;
}